package org.binglan.youziyuepai.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @description:
 * @author: sanjin
 * @date: 2019/4/7 12:37
 */
public class EnumUtils {

    /**
     * 返回枚举类中某个 code 对应的 message
     */
    public static String getMessageByCode(Integer code, Class<? extends Enum> clazz) {
        Enum[] enumConstants = clazz.getEnumConstants();
        try {
            Method getCodeMethod = clazz.getMethod("getCode");
            Method getMessageMethod = clazz.getMethod("getMessage");
            for (Enum enumConstant : enumConstants) {
                Integer enumCode = (Integer) getCodeMethod.invoke(enumConstant);
                if (enumCode.equals(code))
                    return (String) getMessageMethod.invoke(enumConstant);

            }
        } catch (Exception e) {
            return null;
        }
        return null;
    }

    /**
     * 反射判断枚举类中是否包含该 code
     */
    public static boolean isExistsCode(Integer code, Class<? extends Enum> clazz) {
        Enum[] enumConstants = clazz.getEnumConstants();
        try {
            Method getCodeMethod = clazz.getMethod("getCode");
            for (Enum enumConstant : enumConstants) {
                Integer enumCode = (Integer) getCodeMethod.invoke(enumConstant);
                if (enumCode.equals(code))
                    return true;
            }
        } catch (Exception e) {
            return false;
        }
        return false;
    }

    /**
     * 反射获取枚举类中所有对象
     * @param className
     * @return Object 类型，需要进行强制转换
     */
    public static Object getEnumList(String className) {
        Class<Enum> clazz = null;
        try {
            clazz = (Class<Enum>) Class.forName(className);
            // 获取枚举类中 values 方法
            Method enumValuesMethod = clazz.getMethod("values");
            return enumValuesMethod.invoke(clazz);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
    }
}
